#!/usr/bin/env python
# -*- coding: utf-8//IGNORE', $string); -*-

'''
@author: Tiago Barriga Nº6048, Belisa Castelhano Nº6303
@obs: Trabalho de python em LP
ficheiro responsavel pela criação de estatisticas e escrita em .csv
'''


from ReadXls_WriteDB import *
import csv
import matplotlib.pyplot as plt
from sqlalchemy import or_
from sqlalchemy import func

anos = [(CriacaoTabelas.Ano95_96, '1995/1996'), (CriacaoTabelas.Ano96_97, '1996/1997'), (CriacaoTabelas.Ano97_98, '1997/1998'),
        (CriacaoTabelas.Ano98_99, '1998/1999'), (CriacaoTabelas.Ano99_00, '1999/2000'), (CriacaoTabelas.Ano00_01, '2000/2001'),
        (CriacaoTabelas.Ano01_02, '2001/2002'), (CriacaoTabelas.Ano02_03, '2002/2003'), (CriacaoTabelas.Ano03_04, '2003/2004'),
        (CriacaoTabelas.Ano04_05, '2004/2005'), (CriacaoTabelas.Ano05_06, '2005/2006'), (CriacaoTabelas.Ano06_07, '2006/2007'),
        (CriacaoTabelas.Ano07_08, '2007/2008'), (CriacaoTabelas.Ano08_09, '2008/2009'), (CriacaoTabelas.Ano09_10, '2009/2010'),
        (CriacaoTabelas.Ano10_11, '2010/2011')]


class Estatisticas():
    '''
    classe responsavel pela criação das 4 estatistica a gravar no .csv
    '''
    
    def __init__(self):
        '''
        criação de sessão à base de dados
        '''
        AccoesBD.database = create_engine('sqlite:///BaseDados.db', echo = False)
        AccoesBD.login = sessionmaker(bind=AccoesBD.database)
        AccoesBD.login.configure(bind=AccoesBD.database)
        AccoesBD.login = AccoesBD.login()

        pass
    
    def __stats__(self, fileName):
        '''
        Funcão que pesquisa por cursos que incluam os nomes 'computadores' e/ou 'informatica',
        em associação com o Estabelecimento de ensino, unidade organica e anos lectivos
        em que funcionaram.
        @Param filename -> nome do ficehiro(.csv) a ser escrito com as estatisticas
        '''
        try:
            c = csv.writer(open(fileName, "wb"))
            pass
        except IOError: # suppress "No such file or directory" error
            pass
        
        csvList = []
        for i in range(anos.__len__()):
            for x in AccoesBD.login.query(CriacaoTabelas).\
                filter(or_(CriacaoTabelas.Curso_Superior.like('%informática%'.decode('utf-8')),
                           CriacaoTabelas.Curso_Superior.like('%computadores%'.decode('utf-8')))).order_by(CriacaoTabelas.id).\
                filter(anos[i][0] != '-').order_by(CriacaoTabelas.id):                   
                csvList.append([ x.Curso_Superior.encode("utf-8"), x.Estabelecimento.encode("utf-8"), x.Unidade_Organica.encode("utf-8"), str(anos[i][1]).encode("utf-8")])                        
                pass
            pass
        
        try:
            c.writerows(csvList)
            pass
        except UnboundLocalError: # UnboundLocalError: local variable 'c' referenced before assignment
            pass
        
        pass


    def __stats2__(self, fileName ):
        '''
        Função que pesquisa na base de dados a quantidade de alunos que se tem inscrito
        nestes cursos('informatica, computadores') ao longo dos anos e grava num ficheiro escolhido pelo utilizador
        @Param filename -> nome do ficheiro(.csv) a ser escrito com as estatisticas
        '''
        try:
            c = csv.writer(open(fileName, "wb"))
            pass
        except IOError: # suppress "No such file or directory" error
            pass
        
        csvList = []
        total = 0 #  total de inscritos
        for i in range(anos.__len__()):
            for x in AccoesBD.login.query((anos[i][0])).\
                filter(or_(CriacaoTabelas.Curso_Superior.like('%informática%'.decode('utf-8')),
                        CriacaoTabelas.Curso_Superior.like('%computadores%'.decode('utf-8')))).order_by(CriacaoTabelas.id).\
                filter(anos[i][0] != '-').order_by(CriacaoTabelas.id):
                total += x[0]
                pass
            csvList.append(["Ano:{0}".format(str(anos[i][1]).encode('utf-8')),"Inscritos: {0}".format(total)])
            total = 0             
            pass
        try:
            c.writerows(csvList)
            pass
        except UnboundLocalError: # UnboundLocalError: local variable 'c' referenced before assignment
            pass
        
        pass

    '''
    Funcao  que pesquisa na base de dados a quantidade de cursos por
    nível de formação ao longo dos anos e grava num ficheiro escolhido pelo utilizador
    @Param filename -> nome do ficheiro(.csv) a ser escrito com as estatisticas
    '''
    def __stats3__(self, fileName):        
        try:
            c = csv.writer(open(fileName, "wb"))
            pass
        except IOError: # suppress "No such file or directory" error
            pass
        
        csvList = []
        for i in range(anos.__len__()):     
            for x in AccoesBD.login.query(func.count(CriacaoTabelas.Curso_Superior), (CriacaoTabelas.Nivel_Formacao), func.count(CriacaoTabelas.Nivel_Formacao)).\
                filter(anos[i][0] != '-').group_by(CriacaoTabelas.Nivel_Formacao):
                csvList.append([anos[i][1], x[1].encode('utf-8'), "Cursos:{0}".format(x[2]) ])
                pass
            pass
        
        try:
            c.writerows(csvList)
            pass
        except UnboundLocalError: # UnboundLocalError: local variable 'c' referenced before assignment
            pass
        
        pass


    def __stats4__(self, fileName):
        '''
        a quantidade de alunos por nível de formação ao longo dos anos
        @Param filename -> nome do ficehiro a ser criado (.csv) com as estatisticas
        '''
        try:
            c = csv.writer(open(fileName, "wb"))
            pass
        except IOError: # suppress "No such file or directory" error
            pass
        
        csvList = []
        for i in range(anos.__len__()):     
            for x in AccoesBD.login.query(func.sum(anos[i][0]), (CriacaoTabelas.Nivel_Formacao)).\
                filter(anos[i][0] != '-').group_by(CriacaoTabelas.Nivel_Formacao):
                csvList.append([anos[i][1], x[1].encode('utf-8'), "Inscritos:{0}".format(x[0]) ])                  
                pass
            pass
        
        try:
            c.writerows(csvList)
            pass
        except UnboundLocalError: # UnboundLocalError: local variable 'c' referenced before assignment
            pass
        
        pass


    def str_int(self, string):
        '''
        tenta converter uma string em um inteiro
        caso não for possivel a conversao, tenta-se o valor 0
        ou então é porque pode ter virgulas (util quando da base de dados tem '-' e queremos um zero)
        @Param string -> variavel a converter
        @Return ret -> variavel convertida
        '''
        try:
            ret = int(string)
        except ValueError:
            ret = 0
        except ValueError:
            ret = float(string)
            
        return ret
        pass
    

    def getCursos(self, id):
        '''
        @Param Return o nome do curso através do id que recebe como parametro
        @Param id -> id ou codigo do curso na base de dados
        '''
        for x in AccoesBD.login.query(CriacaoTabelas.id ,CriacaoTabelas.Curso_Superior).\
            filter(CriacaoTabelas.id == id):
            pass
        return x[1]

    def getFormacao(self, data, nivelFormacao):
        '''
        recebe como parametros
        @Param data -> indice da data, ex: data = 0, o ano 0 é o 95/96
        @Param nivelFormacao -> um string como o nome do nivel de formação
        @Param Return 
        filtra o ano e o nivel de formação e usando a função ".sum" retorna
        a quantidade de inscritos nessa ano nesse nivel de formação
        '''
        nivelList = []    
        for x in AccoesBD.login.query(func.sum(anos[data][0]), (CriacaoTabelas.Nivel_Formacao)).\
            filter(anos[data][0] != '-').group_by(CriacaoTabelas.Nivel_Formacao).\
            filter((CriacaoTabelas.Nivel_Formacao.like(nivelFormacao.decode('utf-8')))):
            pass
        return x[0]
    
    pass



